package com.qianfeng.function;

//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//  


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Created by Jackiechan on 2022/6/8 15:18
 *
 * @author Jackiechan
 * @version 1.0
 * @since 1.0
 */
public class TestStream2 {
    public static void main(String[] args) {
        //limit就是限流的
        //    new Random().ints().limit(10).forEach(System.err::println);
//        Stream.of("1","22","333","abc","1","2","333","abc","4")
//                //去重
//                .distinct()
//                .forEach(System.err::println);

//        String result = Stream.of("1", "22", "333", "abc", "1", "2", "333", "abc", "4")
//                //获取到第一个数据
//                .findFirst()
//                //Optional中的方法
//                .get();
//        System.err.println(result);
//        String result = Stream.of("1", "22", "333", "abc", "1", "2", "333", "abc", "4")
//                //找任意一个,具体的任意的选择标准取决于实际的实现
//                .findAny()
//                //Optional中的方法
//                .get();
//        System.err.println(result);

        List<Grade> gradeList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Grade grade = new Grade();
            grade.setName("grade->" + i);
            List<Student> students = new ArrayList<>();
            for (int i1 = 0; i1 < 20; i1++) {
                Student student = new Student();
                student.setName(grade.getName() + "==>" + i1);
                student.setAge(i1 +i+ 10);
                students.add(student);
            }
            grade.setStudents(students);
            gradeList.add(grade);
        }
        //System.err.println(gradeList);
        //当前容器(集合)中的数据本身内部还有一个集合数据,我们可以将这些数据转换保存到一个集合中
        //比如当前的例子,我们有一个班级集合,每个班级里面有很多个学生,有一个学生的集合,我们现在想将所有的班级的学生放到一个集合中,就可以使用flatmap
        // 其实flatmap也是一个转换
        List<Student> studentList = gradeList.stream().flatMap(grade -> grade.getStudents().stream()).collect(Collectors.toList());
        // System.err.println(studentList.size());
        //System.err.println(studentList);

        List<Character> characterList = Stream.of("my name is qiaqia")
                //首先按照 进行切分,转换成一个数组
                .map(s -> s.split(" "))
                //从数组转成集合,里面每个数据都是一个字符串
                .flatMap(Arrays::stream)
                //遍历每一个字符串,拿到 my  name is qiaqia 四个字符串
                .map(s -> s.chars().mapToObj(c -> (char) c))
                //再将上面的characterStream中的数据取出来,
                .flatMap(characterStream -> characterStream.map(character -> character.charValue())).collect(Collectors.toList());
        //System.err.println(characterList);
        //reduce,将我们的数据按照顺序传递到我们的函数中,并将返回结果和下一个数据当做参数继续传递到函数中,直到所有的数据都完成为止
        String s = Stream.of("1", "22", "333", "abc", "1", "2", "333", "abc", "4").reduce((s1, s2) -> s1 + s2).get();
        // System.err.println(s);
        //anymatch 就是判断我们的数据中是不是有任意一个数据满足表达式
        boolean anyMatch = Stream.of("1", "22", "333", "abc", "1", "2", "333", "abc", "4").anyMatch(s1 -> s1.length() > 2);
//        System.err.println(anyMatch);
        //allMatch 就是判断我们的数据中是不是有全部都满足表达式
        boolean allMatch = Stream.of("1", "22", "333", "abc", "1", "2", "333", "abc", "4").allMatch(s1 -> s1.length() > 2);
//        System.err.println(allMatch);
        //判断所有的数据是不是都不符合要求
        boolean noneMatch = Stream.of("1", "22", "333", "abc", "1", "2", "333", "abc", "4").noneMatch(s1 -> s1.length() >3);
//        System.err.println(noneMatch);
        //sorted排序,会按照默认的顺序排序
        List<String> list = Stream.of("1", "22", "333", "abc", "1", "2", "333", "abc", "4").sorted().collect(Collectors.toList());
      //  System.err.println(list);
        //会报错, 因为我们的Student没有实现比较的接口,无法按照默认的顺序进行排序,会抛出java.lang.ClassCastException: com.qianfeng.function.Student cannot be cast to java.lang.Comparable
        //List<Student> studentList1 = studentList.stream().sorted().collect(Collectors.toList());
        //System.err.println(studentList1);
        //我们可以带着自定义的排序函数来进行排序,方便我们自定义规则或者是当前类我们无法实现比较接口的时候
        List<Student> studentList1 = studentList.stream().sorted((student1, student2) -> student1.getAge() - student2.getAge()).collect(Collectors.toList());
//        System.err.println(studentList1);
        List<String> stringList = Stream.of("1", "22", "333", "abc", "1", "2", "333", "abc", "4").skip(2).limit(2).collect(Collectors.toList());
       // System.err.println(stringList);
    }
}
